package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"k8s-platform/config"
	"k8s-platform/controller"
	k8slog "k8s-platform/controller/release_system"
	"k8s-platform/db"
	"k8s-platform/middle"
	service "k8s-platform/service/jenkins"
	k8s_ui "k8s-platform/service/k8s-ui"
	"net/http"
)

func main() {
	//初始化gin对象
	r := gin.Default()
	//初始化数据库
	db.Init()
	//初始化jenkins服务器（暂时只支持一个jenkins）
	service.Jenkins_init.Init()
	//跨域配置
	r.Use(middle.Cors())
	//jwt token验证
	//r.Use(middle.JWTAuth())
	//初始化路由
	controller.Router.InitApiRouter(r, db.DB)
	//终端websocket
	go func() {
		//终端websocket
		http.HandleFunc("/ws", k8s_ui.Terminal.WsHandler)
		//流水线实时状态
		http.HandleFunc("/vue-webhook", service.JenkinsGet.VuePipleSatus)
		//接收jenkins http请求消息
		http.HandleFunc("/jenkins-webhook", service.JenkinsGet.PipleJenkinsSatus)
		//k8s部署日志情况
		r.GET("/api/logs/stream/:k8sname", k8slog.K8sDeployHandler.LogStream)
		http.ListenAndServe(":8080", nil)
	}()

	//启动
	r.Run(config.ListenAddr)

	fmt.Println()

}

// 默认配置内容（key=value 格式，与 config.Config 结构体字段对应）
//var defaultConfigContent = `# 数据库配置
//DbUser=root
//DbPassword=123456
//DbHost=localhost
//DbPort=3306
//DbName=k8s_platform
//
//# 文件路径配置（对应 SrcFile/DstFile，可根据实际需求修改）
//SrcFile=./scripts/init.sql
//DstFile=./data/backup.sql
//
//# 管理员账号配置
//AdminUser=admin
//AdminPwd=admin@123
//
//# K8s 相关目录配置
//KubeconfigDir=./kubeconfig
//YamlsDir=./yamls
//
//# GitLab 配置（替换为你的实际地址和 Token）
//Gitlan_url=http://gitlab.example.com
//Gitlab_token=your_gitlab_private_token
//
//# Jenkins 配置（替换为你的 Jenkins 信息）
//Jenkins_url=http://jenkins.example.com:8080
//Jenkins_user=admin
//Jenkins_pass=jenkins@123
//Jenkins_Notifications=http://%s/jenkins-webhook  # 自动填充当前服务地址
//
//# Harbor 镜像仓库配置
//Harbor_url=http://harbor.example.com
//Harbor_user=admin
//Harbor_pass=Harbor12345
//`
//func main() {
//	// 步骤1：自动生成配置文件（核心逻辑，在初始化配置前执行）
//	if err := generateConfigIfNotExists(); err != nil {
//		panic(fmt.Sprintf("启动失败：生成配置文件失败 -> %v", err))
//	}
//
//	// 步骤2：初始化配置（此时配置文件已存在，可正常读取）
//	jConfig := &config.JenkinsConfigTest{}
//	cfg, err := jConfig.ConfigTest()
//	if err != nil {
//		panic(fmt.Sprintf("启动失败：初始化配置失败 -> %v,%s", cfg, err))
//	}
//
//	// 步骤3：初始化 gin 对象
//	r := gin.Default()
//
//	// 步骤4：初始化数据库（使用生成的配置中的数据库信息）
//	db.Init()
//
//	// 步骤5：初始化 jenkins 服务器（使用配置中的 Jenkins 信息）
//	service.Jenkins_init.Init()
//
//	// 跨域配置
//	r.Use(middle.Cors())
//
//	// 初始化路由
//	controller.Router.InitApiRouter(r, db.DB)
//
//	// 终端 websocket 等额外服务（端口从 config 常量读取，若需可改为配置项）
//	go func() {
//		http.HandleFunc("/ws", k8s_ui.Terminal.WsHandler)
//		http.HandleFunc("/vue-webhook", service.JenkinsGet.VuePipleSatus)
//		http.HandleFunc("/jenkins-webhook", service.JenkinsGet.PipleJenkinsSatus)
//		r.GET("/api/logs/stream/:k8sname", k8slog.K8sDeployHandler.LogStream)
//		// 端口改为从 config 常量读取（若需动态配置，可将 ListenAddr 改为配置项）
//		http.ListenAndServe(config.ListenAddr, nil)
//	}()
//
//	// 启动主服务（使用 config 中的 ListenAddr 常量）
//	fmt.Printf("服务启动成功，监听地址：%s\n", config.ListenAddr)
//	if err := r.Run(config.ListenAddr); err != nil {
//		panic(fmt.Sprintf("服务启动失败 -> %v", err))
//	}
//}
//
//// generateConfigIfNotExists：检查配置文件是否存在，不存在则生成默认文件
//func generateConfigIfNotExists() error {
//	// 1. 获取配置文件路径（与 config.ConfigTest 逻辑一致：优先环境变量，否则用默认路径）
//	configFilePath := os.Getenv("CONFIGFILEPATH")
//	if configFilePath == "" {
//		// 若未指定环境变量，默认生成到当前目录的 config.ini（替代原 D:\configtest.txt 开发路径）
//		configFilePath = "config.ini"
//		fmt.Printf("未设置 CONFIGFILEPATH 环境变量，默认生成配置文件到：%s\n", configFilePath)
//	}
//
//	// 2. 检查配置文件是否已存在，存在则直接返回（不覆盖）
//	if _, err := os.Stat(configFilePath); err == nil {
//		fmt.Printf("配置文件已存在：%s，直接使用\n", configFilePath)
//		return nil
//	}
//
//	// 3. 若文件不存在，创建父目录（防止路径不存在导致写入失败）
//	configDir := filepath.Dir(configFilePath)
//	if err := os.MkdirAll(configDir, 0755); err != nil {
//		return fmt.Errorf("创建配置目录失败：%w", err)
//	}
//
//	// 4. 填充默认配置中的动态内容（如 Jenkins 回调地址中的服务端口）
//	listenAddr := config.ListenAddr
//	// 替换 Jenkins_Notifications 中的 %s 为当前服务地址（如 0.0.0.0:9091）
//	filledConfig := fmt.Sprintf(defaultConfigContent, listenAddr)
//
//	// 5. 写入默认配置到文件（权限 0644：所有者可读写，其他只读）
//	if err := os.WriteFile(configFilePath, []byte(filledConfig), 0644); err != nil {
//		return fmt.Errorf("写入默认配置失败：%w", err)
//	}
//
//	fmt.Printf("已成功生成默认配置文件：%s，请根据实际环境修改配置后使用\n", configFilePath)
//	return nil
//}
